home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
scope
/
101-125
/
scopedisk122
/
bassub
/
finfunc.sub
< prev
next >
Wrap
Text File
|
1995-03-19
|
2KB
|
99 lines
'Several functions for doing interest rate functions
'
'rate = interest rate as decimal
'numpds = number of periods in years
'monthflag% = 0 for annual, 1 for monthly payments
REM FNfw1
'Future Worth of $1.00
DEF FNfw1(rate,numpds,monthflag%)
IF monthflag%=1
FNfw1=(1+rate/12)^(numpds*12)
ELSE
FNfw1=(1+rate)^numpds
END IF
END DEF
REM FNpw1
'Present Worth of $1.00
DEF FNpw1(rate,numpds,monthflag%)
IF monthflag%=1
FNpw1=1/FNfw1(rate,numpds,1)
ELSE
FNpw1=1/FNfw1(rate,numpds,0)
END IF
END DEF
REM FNfwa
'Future Worth of $1.00 per period
DEF FNfwa(rate,numpds,monthflag%)
IF monthflag%=1 THEN
FNfwa=((1+rate/12)^(numpds*12)-1)/(rate/12)
ELSE
FNfwa=((1+rate)^numpds-1)/rate
END IF
END DEF
REM FNitao
'Installment to Amortize $1.00
DEF FNitao(rate,numpds,monthflag%)
IF monthflag%=1
FNitao=1/((1-(1/(1+rate/12)^(numpds*12)))/(rate/12))
ELSE
FNitao=1/((1-(1/(1+rate)^numpds))/rate)
END IF
END DEF
REM FNpwa
'Present Worth of $1.00 per period
DEF FNpwa(rate,numpds,monthflag%)
FNpwa=1/FNitao(rate,numpds,monthflag%)
END DEF
REM FNsff
'Sinking Fund Factor
DEF FNsff(rate,numpds,monthflag%)
FNsff=1/FNfwa(rate,numpds,monthflag%)
END DEF
REM FNbal
'Balance of loan at end of holdpds
DEF FNbal(rate,numpds,holdpds,monthflag%)
IF monthflag%=1
FNbal=FNitao(rate,numpds,1)/FNitao(rate,numpds-holdpds,1)
ELSE
FNbal=FNitao(rate,numpds,0)/FNitao(rate,numpds-holdpds,0)
END IF
END DEF
REM irr
'Internal Rate of Return
'cost = initial investment cost
'ncf() = one dimensional array of cashflows [beginning index is 1]
'ret = returns IRR or very small number if failed
REM Internal Rate of Return Algorithm
REM
SUB irr(cost,numpds,monthflag%,ncf(1),ret)
IF cost<0 then cost=(-cost)
IF monthflag%=1
pds=12*numpds
ELSE
pds=numpds
END IF
limit%=100
smalli=0
DO WHILE limit%>0
sum=cost
denom=0
FOR jj%=1 TO pds
pval=ncf(jj%)*EXP(smalli*jj%)
sum=sum-pval
denom=denom+(pval*jj%)
NEXT jj%
deltai=sum/denom
smalli=smalli+deltai
test=ABS(deltai)-0.00005
IF test<=0 THEN
ret=EXP(-smalli)-1
EXIT SUB
ELSEIF test>0 THEN
limit%=limit%-1
ELSE
ret=1.0E+30
EXIT SUB
END IF
LOOP
END SUB